package ai.leinao.notify.core.configuration;

import ai.leinao.notify.core.enums.NotifyType;
import ai.leinao.notify.core.template.Template;
import ai.leinao.notify.core.template.TemplateRegistry;
import ai.leinao.notify.core.template.TemplateProperties;
import lombok.AllArgsConstructor;
import lombok.NonNull;

import java.util.List;
import java.util.Objects;

/**
 * 组合模板管理器
 *
 * @author zhong.wang
 * @date 2025/7/9
 */
@AllArgsConstructor
public class CompositeTemplateRegistry implements TemplateRegistry {
    /**
     * 模板管理器列表
     */
    private final List<TemplateRegistry> registries;

    /**
     * 根据通知类型和属性创建模板
     *
     * @param notifyType 通知类型
     * @param properties 属性
     * @return {@link Template}
     */
    @Override
    public <T extends Template> @NonNull T createTemplate(@NonNull NotifyType notifyType, @NonNull TemplateProperties properties) {
        T template = null;
        for (TemplateRegistry registry : registries) {
            try {
                template = (T) registry.createTemplate(notifyType, properties);
            } catch (Exception e) {
            }
        }
        if (Objects.isNull(template)) {
            throw new UnsupportedOperationException("不支持该模板类型:"+ notifyType.getType());
        }
        return template;
    }

    /**
     * 根据通知类型和模板id获取模板
     *
     * @param notifyType 通知类型
     * @param templateId 模板id
     * @return {@link Template}
     */
    @Override
    public <T extends Template> @NonNull T getTemplate(@NonNull NotifyType notifyType, @NonNull String templateId) {
        T template = null;
        for(TemplateRegistry registry : registries){
            template = (T) registry.getTemplate(notifyType, templateId);
            if(Objects.nonNull(template)){
                break;
            }
        }
        if (Objects.isNull(template)) {
            throw new UnsupportedOperationException("不支持该模板类型:"+ notifyType.getType());
        }
        return template;
    }
}
